﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

using myTutor.Models;
using System.Drawing;
using System.Web.Helpers;

namespace myTutor.Controllers
{
    public partial class TutorController : Controller
    {
        //GET: Tutor/Register
        public ActionResult Register(bool? anonymous, int? tutorId, string function)
        {
            anonymous = anonymous ?? false;
            ViewBag.Anonymous = anonymous;
            ViewBag.Function = function;

            if (tutorId.HasValue)
            {
                var tutorSource = TutorClassFindingRequest.GetTutorClassFindingRequestById(tutorId.Value);
                if (tutorSource != null)
                {
                    return View(tutorSource);
                }
                return RedirectToAction("Error", "Shared");
            }

            TutorClassFindingRequest model = new TutorClassFindingRequest();
            if (Request.IsAuthenticated && anonymous.Value == false)
            {
                UserMaster user = UserMaster.GetUserByUserName(User.Identity.Name);
                model.Name = user.LastName + " " + user.FirstName;
                model.Gender = user.UserProfile.Gender;
                model.BirthYear = user.UserProfile.DOB.HasValue ? user.UserProfile.DOB.Value.Year.ToString() : null;
                model.UniversityName = user.UserProfile.University;
                model.SpecialityId = user.UserProfile.SpecialityId;
                model.MobiPhone = user.UserProfile.MobiPhone;
                model.Email = user.Email;
                model.HouseNumber = user.UserProfile.HouseNumber;
                model.Street = user.UserProfile.Street;
                model.Ward = user.UserProfile.Ward;
                model.ProvinceId = user.UserProfile.ProvinceId;
                model.DistrictId = user.UserProfile.DistrictId;
            }
            return View(model);
        }

        //POST: Tutor/Register
        [HttpPost]
        public ActionResult Register(TutorClassFindingRequest model, bool? anonymous, string function)
        {
            anonymous = anonymous ?? false;
            ViewBag.Anonymous = anonymous;
            ViewBag.Function = function;

            if (ModelState.IsValid)
            {
                if (!SpecialityMaster.IsValidSpecialityId(model.CustomSpecialityId.Value))
                {
                    ModelState.AddModelError("CustomSpecialityId", "Chuyên ngành bạn chọn hiện không khả dụng");
                }
                else if (!ClassMaster.IsValidClassMasterId(model.TutorClassRequireSkill.CustomCanTeachClassLevelFromId.Value))
                {
                    ModelState.AddModelError("TutorClassRequireSkill.CustomCanTeachClassLevelFromId", "Lớp bạn chọn hiện không khả dụng");
                }
                else if (!ClassMaster.IsValidClassMasterId(model.TutorClassRequireSkill.CustomCanTeachClassLevelToId.Value))
                {
                    ModelState.AddModelError("TutorClassRequireSkill.CustomCanTeachClassLevelToId", "Lớp bạn chọn hiện không khả dụng");
                }
                else if (!ProvinceMaster.IsValidProvinceId(model.CustomProvinceId.Value))
                {
                    ModelState.AddModelError("CustomProvinceId", "Tỉnh/Thành phố bạn chọn hiện không khả dụng");
                }
                else if (!DistrictMaster.IsValidDistrictId(model.CustomDistrictId.Value))
                {
                    ModelState.AddModelError("CustomDistrictId", "Huyện/Quận bạn chọn hiện không khả dụng");
                }
                else
                {
                    var fromClassIndex = ClassMaster.GetClassMasterById(model.TutorClassRequireSkill.CanTeachClassLevelFromId.Value).DisplayOrder;
                    var toClassIndex = ClassMaster.GetClassMasterById(model.TutorClassRequireSkill.CanTeachClassLevelToId.Value).DisplayOrder;
                    if (fromClassIndex > toClassIndex)
                    {
                        int? temp = model.TutorClassRequireSkill.CanTeachClassLevelFromId;
                        model.TutorClassRequireSkill.CanTeachClassLevelFromId = model.TutorClassRequireSkill.CanTeachClassLevelToId;
                        model.TutorClassRequireSkill.CanTeachClassLevelToId = temp;
                    }
                    if (model.CustomImageFileName != null && model.CustomImageFileName.ContentLength > 0)
                    {
                        string imageName = "";
                        if (!string.IsNullOrEmpty(model.ImageFileName))
                        {
                            imageName = model.ImageFileName;
                        }
                        else
                        {
                            imageName = "Tutor-" + Guid.NewGuid().ToString() + ".png";
                        }
                        Bitmap original = Bitmap.FromStream(model.CustomImageFileName.InputStream) as Bitmap;

                        Bitmap resizedBitmap = new Bitmap(300, 400);
                        Graphics g = Graphics.FromImage(resizedBitmap as Image);
                        g.DrawImage(original, 0, 0, 300, 400);

                        var imagePath = Server.MapPath("~/Files/Tutors/" + imageName);
                        resizedBitmap.Save(imagePath, System.Drawing.Imaging.ImageFormat.Png);
                        model.ImageFileName = imageName;
                    }
                    if (Request.IsAuthenticated && UserMaster.IsInRole(User.Identity.Name, "1") && function == "edit")
                    {
                        TutorClassFindingRequest.UpdateTutor(model);
                        return RedirectToAction("ManageTutor", "Admin", new { id = model.Id });
                    }
                    if (Request.IsAuthenticated)
                    {
                        model.AuthorId = UserMaster.GetUserByUserName(User.Identity.Name).Id;
                        if (UserMaster.IsInRole(User.Identity.Name, "1"))
                        {
                            model.Status = "3";
                            if (anonymous.HasValue && anonymous.Value)
                            {
                                model.AuthorId = null;
                            }
                        }
                        else
                        {
                            model.Status = "2";
                        }
                    }
                    else
                    {
                        model.Status = "2";
                    }
                    TutorClassFindingRequest.RegisterTutor(model);
                    if (anonymous.Value)
                    {
                        return RedirectToAction("ApproveTutors", "Admin", new { statusId = "3" });
                    }
                    var hostUrl = Request.Url.GetComponents(UriComponents.SchemeAndServer, UriFormat.Unescaped);
                    var linkProfile = hostUrl + VirtualPathUtility.ToAbsolute("~/Account/RegisterFindClassHistory");
                    var linkOnSite = hostUrl + VirtualPathUtility.ToAbsolute("~/Tutor/Detail/" + model.Id);
                    if (!string.IsNullOrEmpty(model.Email))
                    {
                        try
                        {
                            Config.SetupWebmail();
                            WebMail.Send(
                                to: model.Email,
                                subject: "Đăng ký tìm lớp thành công - " + Config.GetFullSiteName(),
                                body: "Chúc mừng bạn đã đăng ký tìm lớp thành công. Mã số tin của bạn là: <b>" + TutorClassFindingRequest.GetMakeUpId(model.Id) + "</b>. Bạn có thể nhấp vào link này để xem lại mẫu tin mình đã đăng được hiển thị trên trang web của hệ hống chúng tôi (Nếu mẫu tin đã được duyệt): " + linkOnSite + ". Hoặc nếu bạn đăng ký bằng tài khoản của hệ thống chúng tôi, bạn có thể xem lại danh sách các mẫu tin mình đã đăng tại mục <a href=\"" + linkProfile + "\">" + "Lịch sử tìm lớp" + "</a>."
                            );
                            if (!model.AuthorId.HasValue)
                            {
                                return RedirectToAction("Info", "Shared", new { title = "Đăng ký thành công", message = "Thông tin đăng ký của bạn đã được lưu vào hệ thống. Chúng tôi cũng đã đã gởi một email thông báo vào hộp thư mà bạn đã cung cấp.", returnPage = "Trang chủ", returnUrl = "/" });
                            }
                            return RedirectToAction("Info", "Shared", new { title = "Đăng ký thành công", message = "Thông tin đăng ký của bạn đã được lưu vào hệ thống. Chúng tôi cũng đã đã gởi một email thông báo vào hộp thư mà bạn đã cung cấp. Bạn có thể xem lại thông tin này tại mục <a href=\"" + linkProfile + "\">" + "Lịch sử tìm lớp" + "</a>.", returnPage = "Trang chủ", returnUrl = "/" });
                        }
                        catch
                        {
                            if (!model.AuthorId.HasValue)
                            {
                                return RedirectToAction("Info", "Shared", new { title = "Thông tin đã được ghi nhận", message = "Thông tin đăng ký của bạn đã được lưu vào hệ thống. Do có sự cố kỹ thuật nên hiện tại chúng tôi không thể gởi email thông báo cho bạn được, tuy nhiên nếu có thông tin mới liên quan, chúng tôi sẽ liên hệ lại với bạn theo các thông tin bạn đã cung cấp.", returnPage = "Trang chủ", returnUrl = "/" });
                            }
                            return RedirectToAction("Info", "Shared", new { title = "Thông tin đã được ghi nhận", message = "Thông tin đăng ký của bạn đã được lưu vào hệ thống. Do có sự cố kỹ thuật nên hiện tại chúng tôi không thể gởi email thông báo như thường lệ cho bạn được, tuy nhiên bạn vẫn có thể xem lại thông tin này tại mục <a href=\"" + linkProfile + "\">" + "Lịch sử tìm lớp" + "</a>.", returnPage = "Trang chủ", returnUrl = "/" });
                        }
                    }
                    if (!model.AuthorId.HasValue)
                    {
                        return RedirectToAction("Info", "Shared", new { title = "Đăng ký thành công", message = "Thông tin đăng ký của bạn đã được lưu vào hệ thống.", returnPage = "Trang chủ", returnUrl = "/" });
                    }
                    return RedirectToAction("Info", "Shared", new { title = "Đăng ký thành công", message = "Thông tin đăng ký của bạn đã được lưu vào hệ thống. Bạn có thể xem lại thông tin này tại mục <a href=\"" + linkProfile + "\">" + "Lịch sử tìm gia sư" + "</a>.", returnPage = "Trang chủ", returnUrl = "/" });
                }
            }
            return View(model);
        }

        public ActionResult Detail(int id)
        {
            var o = TutorClassFindingRequest.GetTutorClassFindingRequestById(id);
            if (o != null)
            {
                if (o.Status == "3")
                {
                    return View(o);
                }
                return RedirectToAction("Info", "Shared", new { title = "Không tìm thấy dữ liệu", message = "Rất tiếc chúng tôi không tìm thấy gia sư có mã số bạn cần do có thể mẫu tin này chưa được duyệt hoặc đã đóng hoặc đã bị xóa vĩnh viễn.", returnPage = "Trang chủ", returnUrl = "/" });
            }
            return RedirectToAction("Error", "Shared");
        }

        public ActionResult GetClass(int? classId, bool? anonymous, int? tranId, string function)
        {
            anonymous = anonymous ?? false;
            ViewBag.Anonymous = anonymous;
            ViewBag.Function = function;

            if (tranId.HasValue)
            {
                ClassTutorTransaction tran = ClassTutorTransaction.GetTransactionById(tranId.Value);
                if (tran != null && tran.ClassId.HasValue)
                {
                    return View(tran);
                }
                return RedirectToAction("Error", "Shared");
            }

            if (classId.HasValue && Class.IsValidClassId(classId.Value))
            {
                var hostUrl = Request.Url.GetComponents(UriComponents.SchemeAndServer, UriFormat.Unescaped);
                var linkProfile = hostUrl + VirtualPathUtility.ToAbsolute("~/Account/GetClassHistory");

                ClassTutorTransaction model = new ClassTutorTransaction();
                model.ClassId = classId;

                if (Request.IsAuthenticated)
                {
                    model.AuthorId = UserMaster.GetUserByUserName(User.Identity.Name).Id;
                    if (UserMaster.IsInRole(User.Identity.Name, "1"))
                    {
                        if (anonymous.Value)
                        {
                            model.AuthorId = null;
                        }
                    }
                    if (model.AuthorId.HasValue)
                    {
                        if (model.AuthorId == Class.GetClassById(classId.Value).AuthorId)
                        {
                            return RedirectToAction("Info", "Shared", new { title = "Bạn không được nhận dạy lớp do chính bạn đăng", message = "Lớp mà bạn vừa yêu cầu đăng ký nhận dạy là do chính bạn đã đăng, xin vui lòng xem lại hoặc chọn dạy lớp khác. Xin chân thành cảm ơn!", returnPage = "Trang chủ", returnUrl = "/" });
                        }
                        if (!Class.IsGetable(model.AuthorId.Value, model.ClassId.Value))
                        {
                            if (!model.AuthorId.HasValue)
                            {
                                return RedirectToAction("Info", "Shared", new { title = "Bạn đã nhận lớp này rồi", message = "Bạn đã nhận lớp này và thông tin vẫn đang được xem xét, chính vì thế bạn không cần phải đăng ký thêm nữa, vui lòng kiểm tra lại trong lịch sửa nhận lớp của bạn tại mục <a href=\"" + linkProfile + "\">" + "Lịch sử nhận lớp" + "</a>.", returnPage = "Trang lịch sử nhận lớp", returnUrl = "/Account/GetClassHistory" });
                            }
                        }
                    }
                    if (!anonymous.Value)
                    {
                        UserMaster user = UserMaster.GetUserByUserName(User.Identity.Name);
                        model.TutorName = user.LastName + " " + user.FirstName;
                        model.TutorGender = user.UserProfile.Gender;
                        model.TutorBirthYear = user.UserProfile.DOB.HasValue ? user.UserProfile.DOB.Value.Year.ToString() : null;
                        model.TutorUniversityName = user.UserProfile.University;
                        model.TutorMobiPhone = user.UserProfile.MobiPhone;
                        model.TutorEmail = user.Email;
                        model.TutorHouseNumber = user.UserProfile.HouseNumber;
                        model.TutorStreet = user.UserProfile.Street;
                        model.TutorWard = user.UserProfile.Ward;
                        model.TutorProvinceId = user.UserProfile.ProvinceId;
                        model.TutorDistrictId = user.UserProfile.DistrictId;
                    }
                }
                return View(model);
            }
            return RedirectToAction("Info", "Shared", new { title = "Không tìm thấy dữ liệu", message = "Rất tiếc chúng tôi không tìm thấy thông tin mà bạn yêu cầu.", returnPage = "Trang chủ", returnUrl = "/" });
        }

        [HttpPost]
        public ActionResult GetClass(ClassTutorTransaction model, bool? anonymous, string function)
        {
            anonymous = anonymous ?? false;
            ViewBag.Anonymous = anonymous;
            ViewBag.Function = function;

            var hostUrl = Request.Url.GetComponents(UriComponents.SchemeAndServer, UriFormat.Unescaped);
            var linkProfile = hostUrl + VirtualPathUtility.ToAbsolute("~/Account/GetClassHistory");

            if (!Class.IsValidClassId(model.ClassId.Value))
            {
                return RedirectToAction("Info", "Shared", new { title = "Không tìm thấy dữ liệu", message = "Rất tiếc chúng tôi không tìm thấy thông tin mà bạn yêu cầu.", returnPage = "Trang chủ", returnUrl = "/" });
            }
            if (string.IsNullOrEmpty(model.CustomTutorName) ||
                string.IsNullOrEmpty(model.CustomTutorGender) ||
                string.IsNullOrEmpty(model.CustomTutorBirthYear) ||
                string.IsNullOrEmpty(model.CustomTutorLevel) ||
                string.IsNullOrEmpty(model.CustomTutorUniversityName) ||
                string.IsNullOrEmpty(model.CustomTutorMobiPhone) ||
                string.IsNullOrEmpty(model.CustomTutorHouseNumber) ||
                string.IsNullOrEmpty(model.CustomTutorStreet) ||
                string.IsNullOrEmpty(model.CustomTutorWard) ||
                !model.CustomTutorSpecialityId.HasValue ||
                !model.CustomTutorProvinceId.HasValue ||
                !model.CustomTutorDistrictId.HasValue)
            {
                return View(model);
            }

            if (Request.IsAuthenticated && UserMaster.IsInRole(User.Identity.Name, "1") && function == "edit")
            {
                ClassTutorTransaction.UpdateTransaction(model);
                return RedirectToAction("ManageClass", "Admin", new { id = model.ClassId });
            }

            if (Request.IsAuthenticated)
            {
                model.AuthorId = UserMaster.GetUserByUserName(User.Identity.Name).Id;
                if (UserMaster.IsInRole(User.Identity.Name, "1"))
                {
                    model.Status = "3";
                    if (anonymous.HasValue && anonymous.Value)
                    {
                        model.AuthorId = null;
                    }
                }
                else
                {
                    model.Status = "2";
                }
                if (model.AuthorId.HasValue && !Class.IsGetable(model.AuthorId.Value, model.ClassId.Value))
                {
                    return RedirectToAction("Info", "Shared", new { title = "Bạn đã nhận lớp này rồi", message = "Bạn đã nhận lớp này và thông tin vẫn đang được xem xét, chính vì thế bạn không cần phải đăng ký thêm nữa, vui lòng kiểm tra lại trong lịch sửa nhận lớp của bạn tại mục <a href=\"" + linkProfile + "\">" + "Lịch sử nhận lớp" + "</a>.", returnPage = "Trang lịch sử nhận lớp", returnUrl = "/Account/GetClassHistory" });
                }
            }
            else
            {
                model.Status = "2";
            }
            if (model.AuthorId == Class.GetClassById(model.ClassId.Value).AuthorId)
            {
                return RedirectToAction("Info", "Shared", new { title = "Bạn không được nhận dạy lớp do chính bạn đăng", message = "Lớp mà bạn vừa yêu cầu đăng ký nhận dạy là do chính bạn đã đăng, xin vui lòng xem lại hoặc chọn dạy lớp khác. Xin chân thành cảm ơn!", returnPage = "Trang chủ", returnUrl = "/" });
            }
            if (model.TutorMobiPhone == Class.GetClassById(model.ClassId.Value).MobiPhone)
            {
                return RedirectToAction("Info", "Shared", new { title = "Có thể bạn đang nhận dạy lớp do chính bạn đăng", message = "Số điện thoại bạn cung cấp trùng khớp với số điện thoại dùng để liên lạc với lớp mà bạn vừa yêu cầu đăng ký nhận dạy, xin vui lòng xem lại hoặc chọn dạy lớp khác. Xin chân thành cảm ơn!", returnPage = "Trang chủ", returnUrl = "/" });
            }
            if (!Class.IsGetable(model.TutorMobiPhone, model.ClassId.Value))
            {
                if (!model.AuthorId.HasValue)
                {
                    return RedirectToAction("Info", "Shared", new { title = "Bạn đã nhận lớp này rồi", message = "Bạn đã nhận lớp này và thông tin vẫn đang được xem xét, chính vì thế bạn không cần phải đăng ký thêm nữa, vui lòng kiểm tra lại trong email thông báo chúng tôi đã gởi cho bạn mỗi khi bạn đăng ký hoặc nhận lớp.", returnPage = "Trang chủ", returnUrl = "/" });
                }
                return RedirectToAction("Info", "Shared", new { title = "Bạn đã nhận lớp này rồi", message = "Bạn đã nhận lớp này và thông tin vẫn đang được xem xét, chính vì thế bạn không cần phải đăng ký thêm nữa, vui lòng kiểm tra lại trong lịch sửa nhận lớp của bạn tại mục <a href=\"" + linkProfile + "\">" + "Lịch sử nhận lớp" + "</a>.", returnPage = "Trang lịch sử nhận lớp", returnUrl = "/Account/GetClassHistory" });
            }
            ClassTutorTransaction.AddTransaction(model);
            if (anonymous.Value)
            {
                return RedirectToAction("ManageTutor", "Admin", new { id = model.ClassFindingId.Value });
            }
            if (!string.IsNullOrEmpty(model.TutorEmail))
            {
                var linkClassDetail = hostUrl + VirtualPathUtility.ToAbsolute("~/Class/Detail/" + model.ClassId);
                try
                {
                    Config.SetupWebmail();
                    WebMail.Send(
                        to: model.TutorEmail,
                        subject: "Đăng ký nhận lớp thành công - " + Config.GetFullSiteName(),
                        body: "Chúc mừng bạn đã đăng ký nhận lớp thành công. Mã số lớp bạn vừa nhận là <a href=\"" + linkClassDetail + "\" title=\"Nhấp vào đây để xem chi tiết lớp.\"><b>" + Class.GetMakeUpId(model.ClassId.Value) + "</b></a>. Mã số giao dịch của bạn là: <b>" + model.GetMakeUpId + "</b>. Nếu bạn đăng ký nhận lớp bằng tài khoản của hệ thống chúng tôi, bạn có thể xem lại danh sách các lớp mình đã đăng ký nhận tại mục <a href=\"" + linkProfile + "\">" + "Lịch sử nhận lớp" + "</a>."
                    );
                    if (!model.AuthorId.HasValue)
                    {
                        return RedirectToAction("Info", "Shared", new { title = "Đăng ký thành công", message = "Thông tin đăng ký của bạn đã được lưu vào hệ thống. Chúng tôi đã đã gởi một email xác nhận vào hộp thư mà bạn đã cung cấp.", returnPage = "Trang chủ", returnUrl = "/" });
                    }
                    return RedirectToAction("Info", "Shared", new { title = "Đăng ký thành công", message = "Thông tin đăng ký của bạn đã được lưu vào hệ thống. Chúng tôi đã đã gởi một email xác nhận vào hộp thư mà bạn đã cung cấp. Bạn có thể xem lại thông tin này tại mục <a href=\"" + linkProfile + "\">" + "Lịch sử nhận lớp" + "</a>.", returnPage = "Trang chủ", returnUrl = "/" });
                }
                catch
                {
                    if (!model.AuthorId.HasValue)
                    {
                        return RedirectToAction("Info", "Shared", new { title = "Thông tin đã được ghi nhận", message = "Thông tin đăng ký của bạn đã được lưu vào hệ thống. Do có sự cố kỹ thuật nên hiện tại chúng tôi không thể gởi email xác nhận cho bạn được, tuy nhiên nếu có thông tin mới liên quan, chúng tôi sẽ liên hệ lại với bạn theo các thông tin bạn đã cung cấp.", returnPage = "Trang chủ", returnUrl = "/" });
                    }
                    return RedirectToAction("Info", "Shared", new { title = "Thông tin đã được ghi nhận", message = "Thông tin đăng ký của bạn đã được lưu vào hệ thống. Do có sự cố kỹ thuật nên hiện tại chúng tôi không thể gởi email xác nhận như thường lệ cho bạn được, tuy nhiên bạn vẫn có thể xem lại thông tin này tại mục <a href=\"" + linkProfile + "\">" + "Lịch sử nhận lớp" + "</a>.", returnPage = "Trang chủ", returnUrl = "/" });
                }
            }
            if (!model.AuthorId.HasValue)
            {
                return RedirectToAction("Info", "Shared", new { title = "Đăng ký thành công", message = "Thông tin đăng ký của bạn đã được lưu vào hệ thống.", returnPage = "Trang chủ", returnUrl = "/" });
            }
            return RedirectToAction("Info", "Shared", new { title = "Đăng ký thành công", message = "Thông tin đăng ký của bạn đã được lưu vào hệ thống. Bạn có thể xem lại thông tin này tại mục <a href=\"" + linkProfile + "\">" + "Lịch sử nhận lớp" + "</a>.", returnPage = "Trang chủ", returnUrl = "/" });
        }
    }
}